import java.util.*;

public class Jututuba implements Runnable{
  public Map<String, Kasutaja> kasutajad=Collections.synchronizedMap(
                                            new HashMap<String, Kasutaja>());
  public void lisaKasutaja(Kasutaja k){
     if(kasutajad.containsKey(k.kasutajanimi)){
	    k.kirjutaja.println(k.kasutajanimi+" juba olemas");
		try{k.sc.close();} catch(Exception e){e.printStackTrace();}
	 } else {
	  synchronized(kasutajad){
	    kasutajad.put(k.kasutajanimi, k);
	  }
      k.kirjutaja.println("Tere tulemast, "+k.kasutajanimi+", Jaagupi jutukasse.");
	  trykiKoigile(k.kasutajanimi+" sisenes");
	 }	 
  }
  
  public void trykiKoigile(String tekst){
     Iterator<Kasutaja> kasutajateLoend=kasutajad.values().iterator();
	 while(kasutajateLoend.hasNext()){
	    Kasutaja k=kasutajateLoend.next();
		k.kirjutaja.println(tekst);
	 }
  }
  
  public void tootleKask(String rida, Kasutaja k){
      if(rida.equals(".loetelu")){
	     k.kirjutaja.println(".loetelualgus");
	     Iterator<String> kasutajanimeloend=kasutajad.keySet().iterator();
		 while(kasutajanimeloend.hasNext()){
		   k.kirjutaja.println(kasutajanimeloend.next());
		 }
	     k.kirjutaja.println(".loeteluots");
	  }  
	  if(rida.equals(".exit")){
	     k.eemaldatav=true;
	  }
  }
  
  public void loe(){
     Iterator<Kasutaja> kasutajateLoend=kasutajad.values().iterator();
	 while(kasutajateLoend.hasNext()){
	    Kasutaja k=kasutajateLoend.next();
  	    try{
		  if(k.lugeja.ready()){
		   String rida=k.lugeja.readLine();
		   if(rida.startsWith(".")){
		     tootleKask(rida, k);
		   } else {
		     trykiKoigile(k.kasutajanimi+": "+rida);
		   }
		  }
	    } catch(Exception ex){ex.printStackTrace();}
	 }     
  }
  
  public void eemaldaEemaldatavad(){
     Iterator<Kasutaja> kasutajateLoend=kasutajad.values().iterator();
	 Set<Kasutaja> eemaldatavad=new HashSet<Kasutaja>();
	 while(kasutajateLoend.hasNext()){
	    Kasutaja k=kasutajateLoend.next();
		if(k.eemaldatav){
		  eemaldatavad.add(k);
		}
	 }
	 for(Kasutaja k:eemaldatavad){
	    trykiKoigile(k.kasutajanimi+" lahkus");
	    kasutajad.remove(k.kasutajanimi);
		try{k.sc.close();} catch(Exception ex){ex.printStackTrace();}
	 }
  }
  
  public void run(){
    while(true){
	  try{Thread.sleep(100);}catch(Exception ex){ex.printStackTrace();}
	  synchronized(kasutajad){
	    loe();
		eemaldaEemaldatavad();
	  }
	}
  }
}